package core

import (
	"errors"
	"fmt"
	"mytool/base"
	"mytool/utils"
	"net"
)

func sesion(c net.Conn) {
	readEnd := make(chan bool, 1)

	// 1.接收消息
	go func() {
		for {
			buffer := make([]byte, 1024)
			n, err := c.Read(buffer)
			if err != nil {
				c.Close()
				readEnd <- true
				break
			}
			fmt.Print(string(buffer[:n]))
		}

	}()

	// 2.发送消息
	for {
		select {
		case <-readEnd:
			return
		default:
			// 2.1 从console接收输入,并判断是否需要特殊处理：不发送空白数据、判断是否是退出信息
			msg := utils.Input("", false)
			if utils.IsContainExit(msg) {
				c.Close()
				return
			}
			// 2.2 发送
			_, err := c.Write([]byte(msg))
			if err != nil {
				c.Close()
				return
			}
		}
	}
}

func Telnet(args []string) (err error) {
	// 参数校验
	port := "23"
	argsLen := len(args)
	if argsLen < 2 {
		return errors.New("参数错误：")
	}
	if argsLen == 3 {
		port = args[2]
	}

	// 建立连接
	address := args[1] + ":" + port
	conn, err := net.Dial("tcp", address)
	if err != nil {
		return err
	}
	defer conn.Close()

	// 进入会话
	fmt.Println("连接成功,输入exit退出.")
	sesion(conn)
	return nil
}

func TelnetTool() *base.Option {
	return &base.Option{"telnet", Telnet, "telnet <ip port> eg. telnet 192.168.1.1 80"}
}
